const mysql = require('mysql2/promise');
require('dotenv').config();

/**
 * 数据库连接池配置
 * 使用连接池可以提高数据库连接的效率和性能
 */
const pool = mysql.createPool({
  host: process.env.DB_HOST || 'localhost',
  port: process.env.DB_PORT || 3306,
  user: process.env.DB_USER || 'root',
  password: process.env.DB_PASSWORD || 'root123',
  database: process.env.DB_NAME || 'parking_system',
  waitForConnections: true,
  connectionLimit: 10, // 最大连接数
  queueLimit: 0,
  charset: 'utf8mb4', // 支持emoji和中文
  timezone: '+08:00', // 设置为北京时间
  // 连接超时设置
  connectTimeout: 30000, // 30秒连接超时
  // 空闲连接超时
  idleTimeout: 300000, // 5分钟空闲超时
  // 启用保活
  enableKeepAlive: true,
  keepAliveInitialDelay: 0
});

/**
 * 测试数据库连接
 */
async function testConnection() {
  try {
    const connection = await pool.getConnection();
    console.log('✅ 数据库连接成功');
    connection.release();
    return true;
  } catch (error) {
    console.error('❌ 数据库连接失败:', error.message);
    return false;
  }
}

/**
 * 执行SQL查询的封装函数
 * @param {string} sql - SQL语句
 * @param {Array} params - 参数数组
 * @returns {Promise} 查询结果
 */
async function query(sql, params = []) {
  let connection;
  try {
    // 获取连接并设置超时
    connection = await pool.getConnection();

    // 执行查询
    const [rows] = await connection.execute(sql, params);
    return rows;
  } catch (error) {
    console.error('SQL查询错误:', error.message);
    console.error('SQL语句:', sql);
    console.error('参数:', params);

    // 根据错误类型提供更详细的错误信息
    if (error.code === 'ETIMEDOUT') {
      console.error('数据库连接超时，请检查网络连接');
    } else if (error.code === 'ER_TRUNCATED_WRONG_VALUE') {
      console.error('数据格式错误，请检查日期时间格式');
    }

    throw error;
  } finally {
    // 确保连接被释放
    if (connection) {
      connection.release();
    }
  }
}

/**
 * 开始事务
 */
async function beginTransaction() {
  const connection = await pool.getConnection();
  await connection.beginTransaction();
  return connection;
}

/**
 * 提交事务
 */
async function commitTransaction(connection) {
  await connection.commit();
  connection.release();
}

/**
 * 回滚事务
 */
async function rollbackTransaction(connection) {
  await connection.rollback();
  connection.release();
}

module.exports = {
  pool,
  query,
  testConnection,
  beginTransaction,
  commitTransaction,
  rollbackTransaction
};